package cn.tedu.oop;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-11 周五 19:17
 */
/**
 * 知识点：
 * 关键字abstract
 * 1.抽象方法 特点 没有方法体
 * 2.抽象类 特点
 * 1）含有抽象方法的类必须被声明成抽象类
 * 2）抽象类 如果含有抽象方法 则其被继承有两种方案
 *    1>子类也抽象，可任意实现或不实现父类的某个抽象方法
 *    2>子类不抽象，必须实现抽象父类的所有抽象方法
 * */
/*本类用于抽象测试的入门案例*/
public class AbstractDemo {
    public static void main(String[] args) {
        /*抽象的类不可以实例化*/
//        Animal a=new Animal();abstract; cannot be instantiated
        Animal a=new Pig();
        Pig p=new Pig();
        /*被重写了的方法，在被多态对象a调用时会体现出多态，调用重写后的方法*/
        a.eat();
        a.play();
        a.fly();//抽象方法 被重写
        a.fly2();//抽象方法 被重写
        p.eat();
        p.play();
        p.fly();//抽象方法 被重写
        p.fly2();//抽象方法 被重写


    }
}
/*s2.abstract修饰的类是抽象类，
如果一个类中含有抽象方法，那这个类必须被声明成抽象类*/
abstract class Animal {
    public void eat() {
        System.out.println("Animal Eat");
    }

    public void play() {
        System.out.println("Animal Play");
    }
/*1.被abstract修饰的方法是抽象方法，抽象方法没有方法体*/
    public abstract void fly();

    public abstract void fly2();
}
/*3.一个类继承了抽象父类之后，有两种解决方案
* 方案一：继续抽象--子类解决  变成抽象子类，“躺平，我也不解决，继续抽象”
* 方案二：实现抽象父类中 所有 抽象方法 “父债子还”*/
class Pig extends Animal {
    @Override
    public void fly() {
        System.out.println("Pig fly");
    }

    @Override
    public void fly2() {
        System.out.println("Pig fly2");
    }
}
